import pandas as pd 
import numpy as np 
import os
from datetime import datetime
from .data_validator import validate_data_quality
from .user_label_generator import generate_user_labels, convert_to_wide_format

def preprocess_user_data(file_path): 
    """ 
    广电用户数据预处理函数 
    
    参数: 
    file_path: CSV文件路径 
    
    返回: 
    处理后的DataFrame 
    """ 
    
    # 1. 读取数据 
    df = pd.read_csv(file_path) 
    
    print(f"原始数据行数: {len(df)}") 
    print(f"原始数据列数: {df.shape[1]}") 
    print(f"原始数据列名: {df.columns.tolist()}") 
    
    # 尝试识别并标准化关键列名
    column_mapping = {}
    
    # 检查列名
    print(f"原始列名: {df.columns.tolist()}")
    
    # 标准化电话号码列 - 支持distinct_usermsg.xxx格式
    phone_mapping = {
        'phone_no': 'phone_no',
        'distinct_usermsg.phone_no': 'phone_no',
        '电话号码': 'phone_no',
        '用户编号': 'phone_no',
        'user_id': 'phone_no',
        'phone': 'phone_no'
    }
    for col in phone_mapping:
        if col in df.columns:
            column_mapping[col] = 'phone_no'
            break
    
    # 标准化产品名称列 - 支持distinct_usermsg.xxx格式
    sm_name_mapping = {
        'sm_name': 'sm_name',
        'distinct_usermsg.sm_name': 'sm_name',
        '产品名称': 'sm_name',
        '套餐名称': 'sm_name',
        'service_name': 'sm_name'
    }
    for col in sm_name_mapping:
        if col in df.columns:
            column_mapping[col] = 'sm_name'
            break
    
    # 标准化时间列 - 支持distinct_usermsg.xxx格式
    run_time_mapping = {
        'run_time': 'run_time',
        'distinct_usermsg.run_time': 'run_time',
        '时间': 'run_time',
        '运行时间': 'run_time',
        'date': 'run_time',
        'datetime': 'run_time'
    }
    for col in run_time_mapping:
        if col in df.columns:
            column_mapping[col] = 'run_time'
            break
    
    # 标准化用户等级列 - 支持distinct_usermsg.xxx格式
    owner_name_mapping = {
        'owner_name': 'owner_name',
        'distinct_usermsg.owner_name': 'owner_name',
        '用户等级': 'owner_name',
        '等级': 'owner_name',
        'user_level': 'owner_name'
    }
    for col in owner_name_mapping:
        if col in df.columns:
            column_mapping[col] = 'owner_name'
            break
    
    # 标准化状态列 - 支持distinct_usermsg.xxx格式
    run_name_mapping = {
        'run_name': 'run_name',
        'distinct_usermsg.run_name': 'run_name',
        '状态': 'run_name',
        '状态名称': 'run_name',
        'status': 'run_name'
    }
    for col in run_name_mapping:
        if col in df.columns:
            column_mapping[col] = 'run_name'
            break
    
    # 重命名列
    if column_mapping:
        df = df.rename(columns=column_mapping)
        print(f"已标准化列名: {column_mapping}")
    
    # 检查关键列是否存在，如果不存在则提前退出
    required_columns = ['phone_no', 'run_time', 'sm_name']
    missing_columns = [col for col in required_columns if col not in df.columns]
    if missing_columns:
        print(f"错误: 缺少必要的列 {missing_columns}，无法继续处理")
        return df
    
    # 2. 数据清洗：去重规则 
    # (1) 根据用户编号(phone_no)分组，保留状态变更时间(run_time)最大值的记录 
    # 确保run_time是datetime类型 
    try:
        df['run_time'] = pd.to_datetime(df['run_time'], errors='coerce')
        # 删除无效的时间记录
        df = df[df['run_time'].notna()]
    except Exception as e:
        print(f"警告: 处理时间列时出错: {e}")
    
    # 首先按phone_no分组，保留每个用户run_time最大的记录 
    try:
        idx_max_run_time = df.groupby('phone_no')['run_time'].idxmax() 
        df_processed = df.loc[idx_max_run_time].reset_index(drop=True) 
        
        print(f"按run_time最大值去重后行数: {len(df_processed)}") 
        
        # (2) 如果仍然重复，删除品牌名称(sm_name)为"模拟有线电视"的数据 
        # 检查是否仍有重复的phone_no 
        duplicate_phones = df_processed[df_processed.duplicated(subset=['phone_no'], keep=False)] 
        
        if len(duplicate_phones) > 0: 
            print(f"发现重复用户编号数量: {len(duplicate_phones['phone_no'].unique())}") 
            
            # 标记需要删除的记录：重复记录中品牌名称为"模拟有线电视"的记录 
            mask_to_delete = ( 
                df_processed.duplicated(subset=['phone_no'], keep=False) & 
                (df_processed['sm_name'].astype(str).str.contains('模拟有线电视', na=False)) 
            ) 
            
            # 保留不满足删除条件的记录 
            df_processed = df_processed[~mask_to_delete] 
            
            # 对于仍然重复的记录，保留第一条（可根据需要调整） 
            df_processed = df_processed.drop_duplicates(subset=['phone_no'], keep='first') 
            
            print(f"删除模拟有线电视并去重后行数: {len(df_processed)}") 
    except Exception as e:
        print(f"警告: 处理去重逻辑时出错: {e}")
        df_processed = df.drop_duplicates(subset=['phone_no'], keep='first')
    
    # 3. 数据质量检查 
    print(f"\n=== 数据质量检查 ===") 
    print(f"最终数据行数: {len(df_processed)}") 
    print(f"唯一用户数: {df_processed['phone_no'].nunique()}") 
    print(f"缺失值统计:") 
    print(df_processed.isnull().sum()) 
    
    # 4. 数据分布分析 
    print(f"\n=== 数据分布分析 ===") 
    if 'sm_name' in df.columns:
        print(f"品牌分布:")
        print(df['sm_name'].value_counts().head(10)) 
    else:
        print("警告: sm_name列不存在，跳过品牌分布分析")
    
    if 'owner_name' in df.columns:
        print(f"\n用户等级分布:")
        print(df['owner_name'].value_counts()) 
    else:
        print("警告: owner_name列不存在，跳用户等级分布分析")
    
    if 'run_name' in df.columns:
        print(f"\n状态分布:")
        print(df['run_name'].value_counts()) 
    else:
        print("警告: run_name列不存在，跳过状态分布分析")
    
    # 尝试导入并使用数据验证功能
    try:
        from .data_validator import validate_data_quality
        print("\n执行数据质量验证...")
        
        # 直接使用处理后的DataFrame进行验证
        validate_data_quality(df_processed)
    except ImportError:
        print("注意: 数据验证模块未找到，跳过验证步骤")
    except Exception as e:
        print(f"数据验证过程中出错: {e}")
    
    return df_processed

def comprehensive_data_preprocessing(input_file, output_file=None, rule_based_ratio=0.3):
    """
    完整的数据预处理流程
    
    参数:
    input_file: 输入文件路径
    output_file: 输出文件路径
    rule_based_ratio: 基于规则打标的比例
    
    返回:
    处理后的DataFrame
    """
    print(f"开始完整数据预处理: {input_file}")
    
    try:
        # 1. 读取数据
        print("阶段1: 读取原始数据...")
        if not os.path.exists(input_file):
            raise FileNotFoundError(f"输入文件不存在: {input_file}")
        
        df = pd.read_csv(input_file, sep=';', encoding='utf-8')
        print(f"  成功读取 {len(df)} 条记录")
        
        # 2. 数据预处理
        print("阶段2: 数据预处理...")
        df_clean = preprocess_user_data(input_file)
        print(f"  预处理完成，保留 {len(df_clean)} 条有效记录")
        
        # 3. 数据质量验证
        print("阶段3: 数据质量验证...")
        validation_result = validate_data_quality(df_clean)
        print(f"  验证完成，{'通过' if validation_result['is_valid'] else '未通过'}")
        
        # 4. 生成用户标签
        print("阶段4: 生成用户标签...")
        labeled_df = generate_user_labels(df_clean, rule_based_ratio)
        
        # 5. 转换为宽表格式
        print("阶段5: 转换为宽表格式...")
        wide_df = convert_to_wide_format(labeled_df)
        
        # 6. 保存结果
        if output_file:
            wide_df.to_csv(output_file, sep=';', index=False, encoding='utf-8')
            print(f"阶段6: 结果已保存到 {output_file}")
        
        print("完整数据预处理流程完成!")
        return wide_df
        
    except Exception as e:
        print(f"完整数据预处理失败: {str(e)}")
        import traceback
        traceback.print_exc()
        raise